package configs

import (
	"fmt"
	"github.com/philchia/agollo/v3"
	"github.com/spf13/viper"
	"log"
	"strings"
	"time"
)

type Apollo struct {
	AppName  string `json:"appName"`
	Cluster  string `json:"cluster"`
	MetaAddr string `json:"metaAddr"`
	// 客户端配置
	Namespace           []string `json:"namespace"`
	Username            string   `json:"username"`
	Password            string   `json:"password"`
	DataId              string   `json:"dataId"`
	Group               string   `json:"group"`
	NotLoadCacheAtStart bool     `json:"notLoadCacheAtStart"`
	TimeoutMs           uint64   `json:"timeoutMs"`       // 超时时间
	UpdateThreadNum     int      `json:"updateThreadNum"` // 更新线程数
	LogDir              string   `json:"logDir"`          // 本地日志目录
	CacheDir            string   `json:"cacheDir"`        // 本地缓存目录
	LogLevel            string   `json:"logLevel"`
}

// 加载配置并更新结构体
func getApolloConfig(client *agollo.Client, nameSpace string) {
	// 获取配置
	content := client.GetNameSpaceContent(nameSpace, "")

	viper.SetConfigType("yaml") // 根据配置格式设置
	err := viper.ReadConfig(strings.NewReader(content))
	if err != nil {
		log.Fatalf("Failed to read config using Viper: %v", err)
	}
	LoadConfig()
	// 打印配置内容
	fmt.Printf("Getting %v Nacos Config Content: %v", viper.GetString("app.name"), content)
}

// 连接Nacos
func InitApollo() {
	// Nacos 服务器的配置
	apollo := EnvConfig.Apollo

	// 初始化 Apollo 客户端
	client := agollo.NewClient(&agollo.Conf{
		AppID:          apollo.AppName,   // Apollo 的应用 ID
		Cluster:        apollo.Cluster,   // 集群名称
		NameSpaceNames: apollo.Namespace, // 默认命名空间
		MetaAddr:       apollo.MetaAddr,
		//IsBackupConfig: true,
		//Secret:         "6ce3ff7e96a24335a9634fe9abca6d51",
		//AccesskeySecret: "b8ceb3ec62f34030b1b1fd9a431e420b",
	})
	if client == nil {
		log.Fatalf("Failed to initialize Apollo client: %v")
	}

	//errCh := client.Start()

	for i := 0; i < len(EnvConfig.Apollo.Namespace); i++ {
		ns := EnvConfig.Apollo.Namespace[i]
		getApolloConfig(client, ns)
	}
	//添加监听

	// 模拟程序长期运行，等待配置更新
	// 通过 `select {}` 阻塞主 goroutine，等待配置变化
	for {
		// 每隔10秒输出一次，模拟一些业务逻辑运行
		time.Sleep(10 * time.Second)
		fmt.Println("Running... Waiting for config changes.")
	}

}
